decline and fall of pokemon empire

昔は人気なかったやつが人気でたり、逆だったり、の極端なやつらをいくつか経時的に追ってったほうがいい気がしてきた。 そういうやつを見つけてみよう:

relativeなrankをつくって、その変動が大きいものをみつけるか。ずっとRankが低い・高いやつをハイライトするのもよさそう

  1. 一番大きなrankから一番小さなRankにいっている(栄枯盛衰のうち栄転)

  2. 一番小さなrankから一番大きなRankにいっている(栄枯盛衰のうち転落)

  3. 大→小→大 (一時期すごかった、はやり)

  4. 小→大→小 (カムバック)

  5. ずっとちいさなRank(ずっと栄光)

  6. ずっと大きなRank(不人気) くらいがとれると面白そう どうやるの relative_rankが…

  7. na.omitしたrankが平均して一番小さい 1.na.omitしたrankが平均して一番大きい…?

no show

COUNT ABSENT

でてくるポケモンではなく、でてこないポケモンに着目してみる。 でてこないポケモンの数もシミュレーションと違う。 prepare all possible entries of pokemons, in that specific era. for example, pokedex 152, gen 2 pokemon cannot appear in game_gen_era == 1 period.

# empty_rank_df <-
#   tibble(
#     pokedex_id = map(
#       .x = 1:8,
#       ~ 1:df_game_gen$pokemon_cumulative_n[.x]
#     ) |> 
#       unlist(),
#     game_gen_era = map(
#       .x = 1:8,
#       ~ rep(.x, df_game_gen$pokemon_cumulative_n[.x])
#     ) |> 
#       unlist()
#   ) |> 
#   left_join(df_names, by = "pokedex_id")

df_no_appearance_empは名前つき。どの名前/pokedex_idのやつが欠けているのかがわかる。

df_no_appearance_emp <-
# df_view <- 
  temporal_change_per_gen_df |> 
  filter(condition == "pokemon name") |> 
  # right_join(empty_rank_df) |> 
  filter(n == 0) |> 
  count(game_gen_era, pokedex_id, pokemon_name, pokemon_name_ja, across(), name = "count_no_shows")
df_no_appearance_emp |> 
  ggplot(aes(x = game_gen_era, pokedex_id)) +
  # geom_point() +
  geom_text(
    aes(label = pokemon_name),
    size = 6 * pt_convert
  )

↑たとえばgame_gen_era == 1 のころには151のミュウだけカードが一度も登場してない。アンノーンにいたっては一時期ものすごく多かったのに、ゼロになってる。ほんとかよ?第2世代の時期で最も多く(1位)、第3世代でゼロ枚、第4世代でまた一位…?まじ?

df_gene |> 
  filter(pokemon_name == "Unown") |> 
  count(release_date) |> 
  ggplot(aes(x = release_date, n)) +
  geom_col() +
  geom_vline(
    data = df_game_gen,
    aes(xintercept = game_release_date),
    inherit.aes = FALSE
  )
Warning: Ignoring unknown parameters: inherit.aes

たしかにぽっかりあいてますね…。

game_gen_era == 8ともなると非常にポケモンが多いので一度も登場していないカードも相当ありそう。

これもかなりランダムとは違う気がするし、測れる気がする。

compare voids with random

↓とりあえずシミュレーションで一度も登場しなかったポケモンの名前をrun==1に限定してプロットしてみる。

↑当然といえば当然なんだけどまんべんなく登場しないポケモンがでてくる。さっきのEmpデータとは大違いである。

compare numerically, then visually

Game-gen-eraごとに集計して、その数がどれくらいシミュレーションと違うかみてみよう ただしrunすべてについて行うので、right_joinが全部に起きないといけないので難しそう

df_no_appearance_sim <- temporal_change_per_gen_df |> 
  filter(condition == "simulations") |> 
  filter(n == 0) |> 
  count(run, game_gen_era, pokemon_gen, name = "count_no_shows") |> 
  mutate(condition = "simulations")

df_no_appearance_emp2は名前の情報なく、とにかくどの世代のポケモンがそれぞれの時期に何人登場していないかがわかる。すべてのありうる組み合わせについて集計したいので、completeと直後のfilterでなんとかした。もっと集計すれば、それぞれの時期に(世代関係なく)何人登場していないかデータになるだろうけど、一旦ここで止めている。

# align emp data to match with sim df
df_no_appearance_emp2 <-
# df_view <- 
  df_no_appearance_emp |> 
  count(game_gen_era, pokemon_gen, name = "count_no_shows") |> 
  complete(
    game_gen_era = 1:8, 
    pokemon_gen = 1:8, 
    fill = list(
      count_no_shows = 0
    )
  ) |> # create all combinations
  filter(game_gen_era >= pokemon_gen) |> # filter out impossible, excessive combos
  mutate(condition = "pokemon name")

いくら第3世代登場直後でも確率的には、ランダムにとれば少しは登場しない奴らがいてもおかしくないのに、全然「一回も登場しないようなポケモンがいない」ということで、正の新奇バイアス…というか、Debutant Biasの傍証といえましょう。第5世代がでるころともなるとその御利益もなくなり、かなりの数が未登場。 ちょっとポケモンじたいの世代は忘れて、時期ごとのAbsenteeの数だけでみてみましょう:

# summarise by game_gen_era only
df_no_appearance2 <- bind_rows(
  df_no_appearance_emp2, df_no_appearance_sim
  ) |> 
  group_by(game_gen_era, condition, run) |> 
  summarise(sum = sum(count_no_shows)) |>
  ungroup() |> 
  complete(game_gen_era, condition, fill = list(sum = 0))
`summarise()` has grouped output by 'game_gen_era', 'condition'. You can override using the `.groups` argument.

ちょっとしたらここ消す

Era1においてsimパンドラ数が偶数だけ?ってのはおかしい気がするんですが。実際empでは1だし。

偶数だけですね…。

全部みごとに重複してますね。ほかのgame_gen_eraならないのだろうか:

重複ないですね。 もう一度temporal_change_per_gen_dfを計算し直したらうまくいった。後でこの部分は消す。

plot

第4世代までは全部登場させるようなバイアスがかかっていて、5世代以降はかなり「もう諦めようぜ、もう多すぎだから全部作ろうと思わないでいいよ」みたいになってることが一目瞭然である。もちろん5世代目以降はランダムでも多いのであれだけど、ランダムの値からのハズレをみても。

plot simVSemp, zansa

紀要載せたいなー rbind trick

p_no_appearance <- 
  df_no_appearance_summary |> 
  ggplot(aes(x = game_gen_era, y = mean_count_no_shows, colour = condition)) +
  geom_violin(
    data = df_no_appearance_sim,
    aes(group = game_gen_era, y = count_no_shows),
    scale = "count",
    fill = pokemon_yellow |> lighten(0.6),
    colour = "transparent",
    bw = .5,
    trim = FALSE
  ) +
  geom_line(
    size = .5
  ) +
  geom_point(
    size = .5,
    # stroke = .05
  ) +
  scale_colour_manual(
    values = c("pokemon name" = pokemon_blue, "simulations" = pokemon_yellow)
  ) +
  scale_x_continuous(
    breaks = 1:8,
    labels = rbind("", 1:4 * 2) |> c()
  ) +
  # scale_y_continuous(trans = "log10")
  facet_wrap(
     vars(pokemon_gen),
     nrow = 1,
     scales = "free",
     labeller = pokemon_gen_labeller
  ) +
  theme_pokemon +
  theme(
    # aspect.ratio = 1,
    # legend.position = "none"
  )
ggsave("./output/p_count_absent.png", width = 166, height = 166/4, unit = "mm", dpi = 600)
ggsave("./output/p_count_absent.pdf", width = 166, height = 166/4, unit = "mm", dpi = 600)

残差

df_no_appearance_residual <- full_join(
  df_no_appearance_emp2 |> select(-condition), df_no_appearance_sim |> select(-condition), by = c("game_gen_era", "pokemon_gen")
  ) |> 
  mutate(count_no_shows.x = replace_na(count_no_shows.x, 0)) |> 
  rename(empirical = "count_no_shows.x", simulations = "count_no_shows.y") |> 
  mutate(residual = empirical - simulations)

df_no_appearance_residual |> 
  # filter(condition == "simulations") |>
  ggplot(aes(x = game_gen_era, y = residual, colour = pokemon_gen - game_gen_era)) +
  geom_hline(yintercept = 1, colour = "blue", alpha = .4) +
  geom_jitter(size = .3, alpha = .3) +
  scale_colour_viridis_c() +
  theme_pokemon

これはプロットが難しいな…ggridgesするときがきた?

第4世代までは新しく登場したばかりのポケモンも昔からのポケモンも大した差はなく平等にとられていた(し、ランダムよりもずっとあますところなくとられていた)が、第5世代では明らかに第5世代が優遇されており、そのアオリを昔の世代たちがくっている

ここ以降は微妙でした

average_relative_rank全Eraつうじてのランクの高さ。数値が低いほど上位を維持している。人気どあい。0.5以上であれば中央以上に人気といっていい。多分。 rank()関数じたいは少ないほうから順にランク1位!としてしまう。nが多いほどランクが上位(小さい)になってほしいので、ここを参考に逆にする。

decline_and_fall_of_pokemon_empire_df <- temporal_change_per_gen_df |> 
  filter(run == 1 | is.na(run)) |> 
  filter(condition %in% c("pokemon name", "simulations")) |>
  # right_join(empty_rank_df) |> 
  group_by(condition, run, game_gen_era) |> 
  # arrange(desc(n)) |> 
  # mutate(n = replace_na(n, 0)) |> # NAを放置すると次のrank()でNAのやつらの順位が一緒にならん
  mutate(rank = rank(-n, ties.method = "min")) |>  # higher n -> smaller rank with -n
  # mutate(rank = rank(-n, ties.method = "random")) |>  # higher n -> smaller rank with -n
  ungroup() |> 
  select(condition, run, game_gen_era, pokemon_gen,  pokedex_id,n, rank, ecdf, ) |> 
  group_by(condition, run, game_gen_era) |> 
  mutate(relative_rank = rank/max(rank, na.rm = TRUE)) |> 
  filter(!is.na(relative_rank)) |> 
  ungroup() |> 
  group_by(condition, run, pokedex_id) |> 
  mutate(
    average_relative_rank = ave(relative_rank, na.rm = TRUE), # 5., 6.
    # delta = 
  ) # 30 sec
decline_and_fall_of_pokemon_empire_df # 8731 x 10
decline_and_fall_of_pokemon_empire_df |> 
  ggplot(aes(y = relative_rank, x = pokedex_id, colour = condition)) +
  geom_point()

なんでPokedex_idによって変な線が見えるんじゃー!面白いけど絶対なんかの都合なので取り除く。→鳥のアゾけましたね minでもrandomでも取り除けた。randomとminで違いすぎやろ。まあminがよかろう。

ポケモンそれぞれの人気の入れ替わり

decline_and_fall_of_pokemon_empire_df |> 
  ggplot(aes(x = game_gen_era,  y = relative_rank, group = pokedex_id, colour = pokedex_id)) +
  geom_line() +
  geom_point() +
  facet_grid(
    cols = vars(pokemon_gen), 
    rows = vars(condition), 
    scales = "free"
    ) +
  theme_pokemon

  # scale_y_continuous(trans = "log10") 
# ggsave("./output/p_emp_decline_journey.svg", width = 166, height = 90, unit = "mm", dpi = 1200)

栄枯盛衰をなんとかデルタ的な感じで数値にする

まずは平均的な、全期をつうじての人気、average_relative_rankでやってみるか… Aveでいいのかわからんし、relativeでいいのかもわからん、なんもわからん Gen8のものはあまりにサンプルサイズが少ないので(Averageの意味がないので)除く。

setting pch = 21 points colour = "transparent" is better better than setting stroke = 0, source

p_average_relative_rank <-
  decline_and_fall_of_pokemon_empire_df |> 
  filter(pokemon_gen < 8) |> 
  select(average_relative_rank, pokedex_id) |> 
  distinct() |> 
  left_join(df_names, by = "pokedex_id") |>
  ggplot(aes(x = pokemon_gen, y = average_relative_rank, colour = condition)) +
  geom_quasirandom(
    dodge.width = .8, 
    alpha = .7, 
    colour = "transparent",
    stroke = 0,
    pch = 21, aes(fill = condition)) +
  geom_smooth(se = FALSE) +
  scale_colour_manual(
    values = c("pokemon name" = pokemon_blue, "simulations" = pokemon_yellow)
  ) +
  scale_fill_manual(
    values = c("pokemon name" = pokemon_blue, "simulations" = pokemon_yellow)
  ) +
  labs(
    x = "Pokémon Generation",
    y = "Average Relative Rank",
  ) +
  facet_grid(
    cols = vars(condition)
  ) +
  theme_pokemon +
  theme(
    legend.position = "none"
  )
Adding missing grouping variables: `condition`, `run`
  

ちょっと最近のやつに甘すぎる基準ですねこれは…。 振り幅でかいやつは誰だ→0からいきなり1位とかになったやつに決まっているので微妙やな とはいえ、Simと比べるとずいぶん傾向がある。ようにも思う。とにかく基準がちょっと適当というか、とりあえず作ったものだからなんともいえんな。rankじゃだめかなあ ふつうにnでやってもいいかも。標準化して…。

やっぱり振り幅の合計かなー ジャーニーがよ

decline_and_fall_of_pokemon_empire_df2 <- 
  decline_and_fall_of_pokemon_empire_df |>  # click game_gen_era, pokedex_id then condition
  ungroup() |> 
  group_by(condition, pokedex_id) |> 
  mutate(
    previous_relative_rank = lead(relative_rank, order_by = game_gen_era),
    delta = relative_rank - previous_relative_rank,
    sum_delta = sum(abs(delta), na.rm = TRUE), # total journey
    ave_sum_delta = sum_delta  / ( 8 - pokemon_gen) # average journey per game gen change
  ) |> 
  select(pokemon_gen, pokedex_id, ave_sum_delta) |>
  distinct()
Adding missing grouping variables: `condition`

なんかあかんわ

decline_and_fall_of_pokemon_empire_df3 <- 
decline_and_fall_of_pokemon_empire_df2 |> 
  ungroup() |> 
  group_by(condition, game_gen_era) |> 
  mutate(standardized_n = n / max(n)) |> 
  ungroup() |> 
  group_by(condition, pokedex_id) |> 
  mutate(avg_std_n = ave(standardized_n))
Error in `group_by()`:
! Must group by variables found in `.data`.
✖ Column `game_gen_era` is not found.
Backtrace:
 1. dplyr::mutate(...)
 6. dplyr:::group_by.data.frame(ungroup(decline_and_fall_of_pokemon_empire_df2), condition, game_gen_era)
decline_and_fall_of_pokemon_empire_df3 |> 
  select(ave_sum_delta, avg_std_n, pokemon_gen) |> 
  distinct() |> 
  ggplot(aes(ave_sum_delta, avg_std_n, colour = pokemon_gen)) +
  geom_point(size = 1, alpha = .3) +
  scale_colour_viridis_c() +
  facet_wrap(
    vars(pokemon_gen)
  )

もうあかんわ。こういうのじゃなくて、とりあえずプロットでハイライトするポケモンを決めたいだけなので、やっぱり各時代の3位くらいまでの動向を調べるだけでかなりいいと思う。 少なくとも1つ、rankが3以下の行を含むグループを返す、というのはkoreでできると思う。

decline_and_fall_of_pokemon_empire_df3_background <- decline_and_fall_of_pokemon_empire_df3 |> 
  filter(condition == "pokemon name") |> 
  ungroup() |> 
  select(n, pokedex_id, game_gen_era, pokemon_gen) |> distinct()
  
# df_top_pokemon <- 
#   decline_and_fall_of_pokemon_empire_df3 |> 
#   ungroup() |> 
#   group_by(condition, pokedex_id) |> 
#   filter(any(rank <= 1)) |> 
#   # filter(pokedex_id %in% top_three$pokedex_id & condition == )
#   left_join(df_names, by = c("pokedex_id", "pokemon_gen")) |> 
#   filter(condition == "pokemon name")
df_top_pokemon |> 
  ggplot(aes(x = game_gen_era, y = n)) +
  geom_quasirandom(
    data = decline_and_fall_of_pokemon_empire_df3_background, 
    aes(colour = pokemon_gen, group = pokemon_gen |> as.factor()),
    size = .2,
    dodge.width = .8
    ) +
  geom_line(aes(colour = pokemon_gen, group = pokedex_id,), size = .3, alpha = .5) +
  geom_image(aes(image = image_large), height= .05, by = "width", asp = 1.5) +
  # scale_size_identity() +
  geom_text_repel(
    aes(label = paste0(pokemon_name, ":r=", rank, "n=", n)),
    min.segment.length = 0,
    family = "Rotis SemiSans Std Light",
    segment.size = .1,
    max.overlaps = 50,
    size = 3 * pt_convert,
    hjust = 0
    ) +
  scale_colour_viridis_c() +
  facet_wrap(vars(condition)) +
  scale_y_continuous(trans = "log10") +
  theme_pokemon +
  theme(
    aspect.ratio = 1/1.5,
    legend.position = "none")
ggsave("./output/p_emp_vs_sim_top_three_decline_and_fall.svg", height = 80, width = 80 * 1.5, units = "mm")
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKIyBkZWNsaW5lIGFuZCBmYWxsIG9mIHBva2Vtb24gZW1waXJlCgrmmJTjga/kurrmsJfjgarjgYvjgaPjgZ/jgoTjgaTjgYzkurrmsJfjgafjgZ/jgorjgIHpgIbjgaDjgaPjgZ/jgorjgIHjga7mpbXnq6/jgarjgoTjgaTjgonjgpLjgYTjgY/jgaTjgYvntYzmmYLnmoTjgavov73jgaPjgabjgaPjgZ/jgbvjgYbjgYzjgYTjgYTmsJfjgYzjgZfjgabjgY3jgZ/jgIIK44Gd44GG44GE44GG44KE44Gk44KS6KaL44Gk44GR44Gm44G/44KI44GG77yaCgpyZWxhdGl2ZeOBqnJhbmvjgpLjgaTjgY/jgaPjgabjgIHjgZ3jga7lpInli5XjgYzlpKfjgY3jgYTjgoLjga7jgpLjgb/jgaTjgZHjgovjgYvjgILjgZrjgaPjgahSYW5r44GM5L2O44GE44O76auY44GE44KE44Gk44KS44OP44Kk44Op44Kk44OI44GZ44KL44Gu44KC44KI44GV44Gd44GGCgoxLiDkuIDnlarlpKfjgY3jgapyYW5r44GL44KJ5LiA55Wq5bCP44GV44GqUmFua+OBq+OBhOOBo+OBpuOBhOOCi++8iOaghOaer+ebm+ihsOOBruOBhuOBoeaghOi7ou+8iQoxLiDkuIDnlarlsI/jgZXjgapyYW5r44GL44KJ5LiA55Wq5aSn44GN44GqUmFua+OBq+OBhOOBo+OBpuOBhOOCi++8iOaghOaer+ebm+ihsOOBruOBhuOBoei7ouiQve+8iQoxLiDlpKfihpLlsI/ihpLlpKfjgIDvvIjkuIDmmYLmnJ/jgZnjgZTjgYvjgaPjgZ/jgIHjga/jgoTjgorvvIkKMS4g5bCP4oaS5aSn4oaS5bCP44CA77yI44Kr44Og44OQ44OD44Kv77yJCjEuIOOBmuOBo+OBqOOBoeOBhOOBleOBqlJhbmvvvIjjgZrjgaPjgajmoITlhYnvvIkKMS4g44Ga44Gj44Go5aSn44GN44GqUmFua++8iOS4jeS6uuawl++8iQrjgY/jgonjgYTjgYzjgajjgozjgovjgajpnaLnmb3jgZ3jgYYK44Gp44GG44KE44KL44GuCnJlbGF0aXZlX3JhbmvjgYzigKYKCjEuIAoxLiAKMS4KMS4KMS4gbmEub21pdOOBl+OBn3JhbmvjgYzlubPlnYfjgZfjgabkuIDnlarlsI/jgZXjgYQKMS5uYS5vbWl044GX44GfcmFua+OBjOW5s+Wdh+OBl+OBpuS4gOeVquWkp+OBjeOBhOKApu+8nwoKCgojIyBubyBzaG93CgpDT1VOVCBBQlNFTlQKCgrjgafjgabjgY/jgovjg53jgrHjg6Ljg7Pjgafjga/jgarjgY/jgIHjgafjgabjgZPjgarjgYTjg53jgrHjg6Ljg7PjgavnnYDnm67jgZfjgabjgb/jgovjgIIK44Gn44Gm44GT44Gq44GE44Od44Kx44Oi44Oz44Gu5pWw44KC44K344Of44Ol44Os44O844K344On44Oz44Go6YGV44GG44CCCnByZXBhcmUgYWxsIHBvc3NpYmxlIGVudHJpZXMgb2YgcG9rZW1vbnMsIGluIHRoYXQgc3BlY2lmaWMgZXJhLiBmb3IgZXhhbXBsZSwgcG9rZWRleCAxNTIsIGdlbiAyIHBva2Vtb24gY2Fubm90IGFwcGVhciBpbiBnYW1lX2dlbl9lcmEgPT0gMSBwZXJpb2QuCgpgYGB7cn0KIyBlbXB0eV9yYW5rX2RmIDwtCiMgICB0aWJibGUoCiMgICAgIHBva2VkZXhfaWQgPSBtYXAoCiMgICAgICAgLnggPSAxOjgsCiMgICAgICAgfiAxOmRmX2dhbWVfZ2VuJHBva2Vtb25fY3VtdWxhdGl2ZV9uWy54XQojICAgICApIHw+IAojICAgICAgIHVubGlzdCgpLAojICAgICBnYW1lX2dlbl9lcmEgPSBtYXAoCiMgICAgICAgLnggPSAxOjgsCiMgICAgICAgfiByZXAoLngsIGRmX2dhbWVfZ2VuJHBva2Vtb25fY3VtdWxhdGl2ZV9uWy54XSkKIyAgICAgKSB8PiAKIyAgICAgICB1bmxpc3QoKQojICAgKSB8PiAKIyAgIGxlZnRfam9pbihkZl9uYW1lcywgYnkgPSAicG9rZWRleF9pZCIpCmBgYAoKCmBkZl9ub19hcHBlYXJhbmNlX2VtcGDjga/lkI3liY3jgaTjgY3jgILjganjga7lkI3liY0vcG9rZWRleF9pZOOBruOChOOBpOOBjOasoOOBkeOBpuOBhOOCi+OBruOBi+OBjOOCj+OBi+OCi+OAggpgYGB7cn0KZGZfbm9fYXBwZWFyYW5jZV9lbXAgPC0KIyBkZl92aWV3IDwtIAogIHRlbXBvcmFsX2NoYW5nZV9wZXJfZ2VuX2RmIHw+IAogIGZpbHRlcihjb25kaXRpb24gPT0gInBva2Vtb24gbmFtZSIpIHw+IAogICMgcmlnaHRfam9pbihlbXB0eV9yYW5rX2RmKSB8PiAKICBmaWx0ZXIobiA9PSAwKSB8PiAKICBjb3VudChnYW1lX2dlbl9lcmEsIHBva2VkZXhfaWQsIHBva2Vtb25fbmFtZSwgcG9rZW1vbl9uYW1lX2phLCBhY3Jvc3MoKSwgbmFtZSA9ICJjb3VudF9ub19zaG93cyIpCmRmX25vX2FwcGVhcmFuY2VfZW1wIHw+IAogIGdncGxvdChhZXMoeCA9IGdhbWVfZ2VuX2VyYSwgcG9rZWRleF9pZCkpICsKICAjIGdlb21fcG9pbnQoKSArCiAgZ2VvbV90ZXh0KAogICAgYWVzKGxhYmVsID0gcG9rZW1vbl9uYW1lKSwKICAgIHNpemUgPSA2ICogcHRfY29udmVydAogICkKYGBgCuKGkeOBn+OBqOOBiOOBsGdhbWVfZ2VuX2VyYSA9PSAxIOOBruOBk+OCjeOBq+OBrzE1MeOBruODn+ODpeOCpuOBoOOBkeOCq+ODvOODieOBjOS4gOW6puOCgueZu+WgtOOBl+OBpuOBquOBhOOAguOCouODs+ODjuODvOODs+OBq+OBhOOBn+OBo+OBpuOBr+S4gOaZguacn+OCguOBruOBmeOBlOOBj+WkmuOBi+OBo+OBn+OBruOBq+OAgeOCvOODreOBq+OBquOBo+OBpuOCi+OAguOBu+OCk+OBqOOBi+OCiO+8n+esrDLkuJbku6Pjga7mmYLmnJ/jgafmnIDjgoLlpJrjgY/vvIgx5L2N77yJ44CB56ysM+S4luS7o+OBp+OCvOODreaemuOAgeesrDTkuJbku6Pjgafjgb7jgZ/kuIDkvY3igKbvvJ/jgb7jgZjvvJ8KCmBgYHtyfQpkZl9nZW5lIHw+IAogIGZpbHRlcihwb2tlbW9uX25hbWUgPT0gIlVub3duIikgfD4gCiAgY291bnQocmVsZWFzZV9kYXRlKSB8PiAKICBnZ3Bsb3QoYWVzKHggPSByZWxlYXNlX2RhdGUsIG4pKSArCiAgZ2VvbV9jb2woKSArCiAgZ2VvbV92bGluZSgKICAgIGRhdGEgPSBkZl9nYW1lX2dlbiwKICAgIGFlcyh4aW50ZXJjZXB0ID0gZ2FtZV9yZWxlYXNlX2RhdGUpLAogICAgaW5oZXJpdC5hZXMgPSBGQUxTRQogICkKYGBgCuOBn+OBl+OBi+OBq+OBveOBo+OBi+OCiuOBguOBhOOBpuOBvuOBmeOBreKApuOAggoKZ2FtZV9nZW5fZXJhID09IDjjgajjgoLjgarjgovjgajpnZ7luLjjgavjg53jgrHjg6Ljg7PjgYzlpJrjgYTjga7jgafkuIDluqbjgoLnmbvloLTjgZfjgabjgYTjgarjgYTjgqvjg7zjg4njgoLnm7jlvZPjgYLjgorjgZ3jgYbjgIIKCuOBk+OCjOOCguOBi+OBquOCiuODqeODs+ODgOODoOOBqOOBr+mBleOBhuawl+OBjOOBmeOCi+OBl+OAgea4rOOCjOOCi+awl+OBjOOBmeOCi+OAggoKIyMgY29tcGFyZSB2b2lkcyB3aXRoIHJhbmRvbQoK4oaT44Go44KK44GC44GI44Ga44K344Of44Ol44Os44O844K344On44Oz44Gn5LiA5bqm44KC55m75aC044GX44Gq44GL44Gj44Gf44Od44Kx44Oi44Oz44Gu5ZCN5YmN44KScnVuPT0x44Gr6ZmQ5a6a44GX44Gm44OX44Ot44OD44OI44GX44Gm44G/44KL44CCCmBgYHtyfQp0ZW1wb3JhbF9jaGFuZ2VfcGVyX2dlbl9kZiB8PiAKICBmaWx0ZXIoY29uZGl0aW9uID09ICJzaW11bGF0aW9ucyIsIHJ1biA9PSAxKSB8PiAKICBmaWx0ZXIobiA9PSAwKSB8PiAKICBjb3VudChnYW1lX2dlbl9lcmEsIHBva2VkZXhfaWQsIHBva2Vtb25fbmFtZSwgcG9rZW1vbl9uYW1lX2phLCBhY3Jvc3MoKSwgbmFtZSA9ICJjb3VudF9ub19zaG93cyIpIHw+IAogIGdncGxvdChhZXMoeCA9IGdhbWVfZ2VuX2VyYSwgcG9rZWRleF9pZCkpICsKICAjIGdlb21fcG9pbnQoKSArCiAgZ2VvbV90ZXh0KAogICAgYWVzKGxhYmVsID0gcG9rZW1vbl9uYW1lKSwKICAgIHNpemUgPSA2ICogcHRfY29udmVydCwKICAgIGFscGhhID0uNQogICkgKwogIHRoZW1lX3Bva2Vtb24KICAKYGBgCgrihpHlvZPnhLbjgajjgYTjgYjjgbDlvZPnhLbjgarjgpPjgaDjgZHjganjgb7jgpPjgbnjgpPjgarjgY/nmbvloLTjgZfjgarjgYTjg53jgrHjg6Ljg7PjgYzjgafjgabjgY/jgovjgILjgZXjgaPjgY3jga5FbXDjg4fjg7zjgr/jgajjga/lpKfpgZXjgYTjgafjgYLjgovjgIIKCiMjIyBjb21wYXJlIG51bWVyaWNhbGx5LCB0aGVuIHZpc3VhbGx5CgpHYW1lLWdlbi1lcmHjgZTjgajjgavpm4boqIjjgZfjgabjgIHjgZ3jga7mlbDjgYzjganjgozjgY/jgonjgYTjgrfjg5/jg6Xjg6zjg7zjgrfjg6fjg7PjgajpgZXjgYbjgYvjgb/jgabjgb/jgojjgYYK44Gf44Gg44GXcnVu44GZ44G544Gm44Gr44Gk44GE44Gm6KGM44GG44Gu44Gn44CBcmlnaHRfam9pbuOBjOWFqOmDqOOBq+i1t+OBjeOBquOBhOOBqOOBhOOBkeOBquOBhOOBruOBp+mbo+OBl+OBneOBhgoKYGBge3J9CmRmX25vX2FwcGVhcmFuY2Vfc2ltIDwtIHRlbXBvcmFsX2NoYW5nZV9wZXJfZ2VuX2RmIHw+IAogIGZpbHRlcihjb25kaXRpb24gPT0gInNpbXVsYXRpb25zIikgfD4gCiAgZmlsdGVyKG4gPT0gMCkgfD4gCiAgY291bnQocnVuLCBnYW1lX2dlbl9lcmEsIHBva2Vtb25fZ2VuLCBuYW1lID0gImNvdW50X25vX3Nob3dzIikgfD4gCiAgbXV0YXRlKGNvbmRpdGlvbiA9ICJzaW11bGF0aW9ucyIpCmBgYAoKYGRmX25vX2FwcGVhcmFuY2VfZW1wMmDjga/lkI3liY3jga7mg4XloLHjgarjgY/jgIHjgajjgavjgYvjgY/jganjga7kuJbku6Pjga7jg53jgrHjg6Ljg7PjgYzjgZ3jgozjgZ7jgozjga7mmYLmnJ/jgavkvZXkurrnmbvloLTjgZfjgabjgYTjgarjgYTjgYvjgYzjgo/jgYvjgovjgILjgZnjgbnjgabjga7jgYLjgorjgYbjgovntYTjgb/lkIjjgo/jgZvjgavjgaTjgYTjgabpm4boqIjjgZfjgZ/jgYTjga7jgafjgIFjb21wbGV0ZeOBqOebtOW+jOOBrmZpbHRlcuOBp+OBquOCk+OBqOOBi+OBl+OBn+OAguOCguOBo+OBqOmbhuioiOOBmeOCjOOBsOOAgeOBneOCjOOBnuOCjOOBruaZguacn+OBq++8iOS4luS7o+mWouS/guOBquOBj++8ieS9leS6uueZu+WgtOOBl+OBpuOBhOOBquOBhOOBi+ODh+ODvOOCv+OBq+OBquOCi+OBoOOCjeOBhuOBkeOBqeOAgeS4gOaXpuOBk+OBk+OBp+atouOCgeOBpuOBhOOCi+OAggpgYGB7cn0KIyBhbGlnbiBlbXAgZGF0YSB0byBtYXRjaCB3aXRoIHNpbSBkZgpkZl9ub19hcHBlYXJhbmNlX2VtcDIgPC0KIyBkZl92aWV3IDwtIAogIGRmX25vX2FwcGVhcmFuY2VfZW1wIHw+IAogIGNvdW50KGdhbWVfZ2VuX2VyYSwgcG9rZW1vbl9nZW4sIG5hbWUgPSAiY291bnRfbm9fc2hvd3MiKSB8PiAKICBjb21wbGV0ZSgKICAgIGdhbWVfZ2VuX2VyYSA9IDE6OCwgCiAgICBwb2tlbW9uX2dlbiA9IDE6OCwgCiAgICBmaWxsID0gbGlzdCgKICAgICAgY291bnRfbm9fc2hvd3MgPSAwCiAgICApCiAgKSB8PiAjIGNyZWF0ZSBhbGwgY29tYmluYXRpb25zCiAgZmlsdGVyKGdhbWVfZ2VuX2VyYSA+PSBwb2tlbW9uX2dlbikgfD4gIyBmaWx0ZXIgb3V0IGltcG9zc2libGUsIGV4Y2Vzc2l2ZSBjb21ib3MKICBtdXRhdGUoY29uZGl0aW9uID0gInBva2Vtb24gbmFtZSIpCmBgYAoK44GE44GP44KJ56ys77yT5LiW5Luj55m75aC055u05b6M44Gn44KC56K6546H55qE44Gr44Gv44CB44Op44Oz44OA44Og44Gr44Go44KM44Gw5bCR44GX44Gv55m75aC044GX44Gq44GE5aW044KJ44GM44GE44Gm44KC44GK44GL44GX44GP44Gq44GE44Gu44Gr44CB5YWo54S244CM5LiA5Zue44KC55m75aC044GX44Gq44GE44KI44GG44Gq44Od44Kx44Oi44Oz44GM44GE44Gq44GE44CN44Go44GE44GG44GT44Go44Gn44CB5q2j44Gu5paw5aWH44OQ44Kk44Ki44K54oCm44Go44GE44GG44GL44CBRGVidXRhbnQgQmlhc+OBruWCjeiovOOBqOOBhOOBiOOBvuOBl+OCh+OBhuOAguesrO+8leS4luS7o+OBjOOBp+OCi+OBk+OCjeOBqOOCguOBquOCi+OBqOOBneOBruW+oeWIqeebiuOCguOBquOBj+OBquOCiuOAgeOBi+OBquOCiuOBruaVsOOBjOacqueZu+WgtOOAggrjgaHjgofjgaPjgajjg53jgrHjg6Ljg7PjgZjjgZ/jgYTjga7kuJbku6Pjga/lv5jjgozjgabjgIHmmYLmnJ/jgZTjgajjga5BYnNlbnRlZeOBruaVsOOBoOOBkeOBp+OBv+OBpuOBv+OBvuOBl+OCh+OBhu+8mgoKYGBge3J9CiMgc3VtbWFyaXNlIGJ5IHBva2Vtb25fZ2VuICYgZ2FtZV9nZW5fZXJhCmRmX25vX2FwcGVhcmFuY2Vfc3VtbWFyeSA8LSBiaW5kX3Jvd3MoCiAgZGZfbm9fYXBwZWFyYW5jZV9lbXAyLCBkZl9ub19hcHBlYXJhbmNlX3NpbQogICkgfD4gCiAgZ3JvdXBfYnkoZ2FtZV9nZW5fZXJhLCBwb2tlbW9uX2dlbiwgY29uZGl0aW9uKSB8PiAKICBzdW1tYXJpc2UobWVhbl9jb3VudF9ub19zaG93cyA9IG1lYW4oY291bnRfbm9fc2hvd3MpKQojIG5vdGUgdGhhdCBgbWVhbl9jb3VudF9ub19zaG93c2AgaXMgCiMgZXhhY3RseSB0aGUgc2FtZSBhcyB0aGUgY291bnRfbm9fc2hvd3MuIAojIHVzaW5nIHRoZSBzYW1lIG5hbWUganVzdCBmb3IgcGxvdHRpbmcgcHVycG9zZXMuCgojIHN1bW1hcmlzZSBieSBnYW1lX2dlbl9lcmEgb25seQpkZl9ub19hcHBlYXJhbmNlMiA8LSBiaW5kX3Jvd3MoCiAgZGZfbm9fYXBwZWFyYW5jZV9lbXAyLCBkZl9ub19hcHBlYXJhbmNlX3NpbQogICkgfD4gCiAgZ3JvdXBfYnkoZ2FtZV9nZW5fZXJhLCBjb25kaXRpb24sIHJ1bikgfD4gCiAgc3VtbWFyaXNlKHN1bSA9IHN1bShjb3VudF9ub19zaG93cykpIHw+CiAgdW5ncm91cCgpIHw+IAogIGNvbXBsZXRlKGdhbWVfZ2VuX2VyYSwgY29uZGl0aW9uLCBmaWxsID0gbGlzdChzdW0gPSAwKSkKYGBgCiMjIyDjgaHjgofjgaPjgajjgZfjgZ/jgonjgZPjgZPmtojjgZkKRXJh77yR44Gr44GK44GE44Gmc2lt44OR44Oz44OJ44Op5pWw44GM5YG25pWw44Gg44GR77yf44Gj44Gm44Gu44Gv44GK44GL44GX44GE5rCX44GM44GZ44KL44KT44Gn44GZ44GM44CC5a6f6ZqbZW1w44Gn44Gv77yR44Gg44GX44CCCgpgYGB7cn0KZGZfdmlldyA8LSBkZl9ub19hcHBlYXJhbmNlMiB8PiAKICBmaWx0ZXIoCiAgICBjb25kaXRpb24gPT0gInNpbXVsYXRpb25zIiwKICAgIGdhbWVfZ2VuX2VyYSA9PSAxCiAgKQpgYGAK5YG25pWw44Gg44GR44Gn44GZ44Gt4oCm44CCCgpgYGB7cn0KZGZfbm9fYXBwZWFyYW5jZV9zaW3jgIB8PiBmaWx0ZXIoCiAgICBjb25kaXRpb24gPT0gInNpbXVsYXRpb25zIiwKICAgIGdhbWVfZ2VuX2VyYSA9PSAxCiAgKQoKdGVtcG9yYWxfY2hhbmdlX3Blcl9nZW5fZGYgfD4gCiAgZmlsdGVyKAogICAgY29uZGl0aW9uID09ICJzaW11bGF0aW9ucyIsCiAgICBydW4gPT0gMTI1LCAKICAgIGdhbWVfZ2VuX2VyYSA9PSAxLAogIG4gPT0gMCkgCmBgYArlhajpg6jjgb/jgZTjgajjgavph43opIfjgZfjgabjgb7jgZnjga3jgILjgbvjgYvjga5nYW1lX2dlbl9lcmHjgarjgonjgarjgYTjga7jgaDjgo3jgYbjgYvvvJoKYGBge3J9CmRmX3ZpZXcgPC0gdGVtcG9yYWxfY2hhbmdlX3Blcl9nZW5fZGYgfD4gCiAgZmlsdGVyKAogICAgY29uZGl0aW9uID09ICJzaW11bGF0aW9ucyIsCiAgICBydW4gPT0gMTI1LCAKICAgIGdhbWVfZ2VuX2VyYSA9PSAyLAogIG4gPT0gMCkgCmBgYArph43opIfjgarjgYTjgafjgZnjga3jgIIK44KC44GG5LiA5bqmYHRlbXBvcmFsX2NoYW5nZV9wZXJfZ2VuX2RmYOOCkuioiOeul+OBl+ebtOOBl+OBn+OCieOBhuOBvuOBj+OBhOOBo+OBn+OAguW+jOOBp+OBk+OBrumDqOWIhuOBr+a2iOOBmeOAggoKIyMjIHBsb3QKCmBgYHtyfQojIHBfcGFuZG9yYXNfYWdncmVnYXRlIDwtCmRmX25vX2FwcGVhcmFuY2UyIHw+IAogIGZpbHRlcihjb25kaXRpb24gPT0gInNpbXVsYXRpb25zIikgfD4gCiAgZ2dwbG90KGFlcyh4ID0gZ2FtZV9nZW5fZXJhLCB5ID0gc3VtLCBmaWxsID0gZ2FtZV9nZW5fZXJhKSkgKwogIGdlb21fcXVhc2lyYW5kb20oc2l6ZSA9IC4xLCBwY2ggPSAyMSxjb2xvdXIgPSAidHJhbnNwYXJlbnQiLCBzdHJva2UgPSAwKSArCiAgZ2VvbV9saW5lKAogICAgZGF0YSA9IGRmX25vX2FwcGVhcmFuY2UyIHw+IGZpbHRlcihjb25kaXRpb24gPT0gInBva2Vtb24gbmFtZSIpLAogICAgY29sb3VyID0gcG9rZW1vbl9ibHVlLAogICAgc2l6ZSA9IC4yLAogICAgbGluZXR5cGUgPSAiZG90dGVkIgogICkgKwogIGdlb21fcG9pbnQoCiAgICBkYXRhID0gZGZfbm9fYXBwZWFyYW5jZTIgfD4gZmlsdGVyKGNvbmRpdGlvbiA9PSAicG9rZW1vbiBuYW1lIiksCiAgICBmaWxsID0gcG9rZW1vbl9ibHVlLAogICAgcGNoID0gMjEsCiAgICBjb2xvdXIgPSAiYmxhY2siLAogICAgc3Ryb2tlID0gLjEKICApICsKICBzY2FsZV9maWxsX3ZpcmlkaXNfYygpICsKICB0aGVtZV9wb2tlbW9uCmdnc2F2ZSgiLi9vdXRwdXQvcF9wYW5kb3Jhc19hZ2dyZWdhdGUucG5nIikKYGBgCuesrO+8lOS4luS7o+OBvuOBp+OBr+WFqOmDqOeZu+WgtOOBleOBm+OCi+OCiOOBhuOBquODkOOCpOOCouOCueOBjOOBi+OBi+OBo+OBpuOBhOOBpuOAge+8leS4luS7o+S7pemZjeOBr+OBi+OBquOCiuOAjOOCguOBhuirpuOCgeOCiOOBhuOBnOOAgeOCguOBhuWkmuOBmeOBjuOBoOOBi+OCieWFqOmDqOS9nOOCjeOBhuOBqOaAneOCj+OBquOBhOOBp+OBhOOBhOOCiOOAjeOBv+OBn+OBhOOBq+OBquOBo+OBpuOCi+OBk+OBqOOBjOS4gOebrueereeEtuOBp+OBguOCi+OAguOCguOBoeOCjeOCk++8leS4luS7o+ebruS7pemZjeOBr+ODqeODs+ODgOODoOOBp+OCguWkmuOBhOOBruOBp+OBguOCjOOBoOOBkeOBqeOAgeODqeODs+ODgOODoOOBruWApOOBi+OCieOBruODj+OCuuODrOOCkuOBv+OBpuOCguOAggoKCiMjIyBwbG90IHNpbVZTZW1wLCB6YW5zYQoK57SA6KaB6LyJ44Gb44Gf44GE44Gq44O8CltyYmluZCB0cmlja10oaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMjU5NjE4OTcvaG93LXRvLW1lcmdlLTItdmVjdG9ycy1hbHRlcm5hdGluZy1pbmRleGVzKQpgYGB7cn0KcF9ub19hcHBlYXJhbmNlIDwtIAogIGRmX25vX2FwcGVhcmFuY2Vfc3VtbWFyeSB8PiAKICBnZ3Bsb3QoYWVzKHggPSBnYW1lX2dlbl9lcmEsIHkgPSBtZWFuX2NvdW50X25vX3Nob3dzLCBjb2xvdXIgPSBjb25kaXRpb24pKSArCiAgZ2VvbV92aW9saW4oCiAgICBkYXRhID0gZGZfbm9fYXBwZWFyYW5jZV9zaW0sCiAgICBhZXMoZ3JvdXAgPSBnYW1lX2dlbl9lcmEsIHkgPSBjb3VudF9ub19zaG93cyksCiAgICBzY2FsZSA9ICJjb3VudCIsCiAgICBmaWxsID0gcG9rZW1vbl95ZWxsb3cgfD4gbGlnaHRlbigwLjYpLAogICAgY29sb3VyID0gInRyYW5zcGFyZW50IiwKICAgIGJ3ID0gLjUsCiAgICB0cmltID0gRkFMU0UKICApICsKICBnZW9tX2xpbmUoCiAgICBzaXplID0gLjUKICApICsKICBnZW9tX3BvaW50KAogICAgc2l6ZSA9IC41LAogICAgIyBzdHJva2UgPSAuMDUKICApICsKICBzY2FsZV9jb2xvdXJfbWFudWFsKAogICAgdmFsdWVzID0gYygicG9rZW1vbiBuYW1lIiA9IHBva2Vtb25fYmx1ZSwgInNpbXVsYXRpb25zIiA9IHBva2Vtb25feWVsbG93KQogICkgKwogIHNjYWxlX3hfY29udGludW91cygKICAgIGJyZWFrcyA9IDE6OCwKICAgIGxhYmVscyA9IHJiaW5kKCIiLCAxOjQgKiAyKSB8PiBjKCkKICApICsKICAjIHNjYWxlX3lfY29udGludW91cyh0cmFucyA9ICJsb2cxMCIpCiAgZmFjZXRfd3JhcCgKICAgICB2YXJzKHBva2Vtb25fZ2VuKSwKICAgICBucm93ID0gMSwKICAgICBzY2FsZXMgPSAiZnJlZSIsCiAgICAgbGFiZWxsZXIgPSBwb2tlbW9uX2dlbl9sYWJlbGxlcgogICkgKwogIHRoZW1lX3Bva2Vtb24gKwogIHRoZW1lKAogICAgIyBhc3BlY3QucmF0aW8gPSAxLAogICAgIyBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIKICApCmdnc2F2ZSgiLi9vdXRwdXQvcF9jb3VudF9hYnNlbnQucG5nIiwgd2lkdGggPSAxNjYsIGhlaWdodCA9IDE2Ni80LCB1bml0ID0gIm1tIiwgZHBpID0gNjAwKQpnZ3NhdmUoIi4vb3V0cHV0L3BfY291bnRfYWJzZW50LnBkZiIsIHdpZHRoID0gMTY2LCBoZWlnaHQgPSAxNjYvNCwgdW5pdCA9ICJtbSIsIGRwaSA9IDYwMCkKCmBgYAoKIyMg5q6L5beuCmBgYHtyfQpkZl9ub19hcHBlYXJhbmNlX3Jlc2lkdWFsIDwtIGZ1bGxfam9pbigKICBkZl9ub19hcHBlYXJhbmNlX2VtcDIgfD4gc2VsZWN0KC1jb25kaXRpb24pLCBkZl9ub19hcHBlYXJhbmNlX3NpbSB8PiBzZWxlY3QoLWNvbmRpdGlvbiksIGJ5ID0gYygiZ2FtZV9nZW5fZXJhIiwgInBva2Vtb25fZ2VuIikKICApIHw+IAogIG11dGF0ZShjb3VudF9ub19zaG93cy54ID0gcmVwbGFjZV9uYShjb3VudF9ub19zaG93cy54LCAwKSkgfD4gCiAgcmVuYW1lKGVtcGlyaWNhbCA9ICJjb3VudF9ub19zaG93cy54Iiwgc2ltdWxhdGlvbnMgPSAiY291bnRfbm9fc2hvd3MueSIpIHw+IAogIG11dGF0ZShyZXNpZHVhbCA9IGVtcGlyaWNhbCAtIHNpbXVsYXRpb25zKQoKZGZfbm9fYXBwZWFyYW5jZV9yZXNpZHVhbCB8PiAKICAjIGZpbHRlcihjb25kaXRpb24gPT0gInNpbXVsYXRpb25zIikgfD4KICBnZ3Bsb3QoYWVzKHggPSBnYW1lX2dlbl9lcmEsIHkgPSByZXNpZHVhbCwgY29sb3VyID0gcG9rZW1vbl9nZW4gLSBnYW1lX2dlbl9lcmEpKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMSwgY29sb3VyID0gImJsdWUiLCBhbHBoYSA9IC40KSArCiAgZ2VvbV9qaXR0ZXIoc2l6ZSA9IC4zLCBhbHBoYSA9IC4zKSArCiAgc2NhbGVfY29sb3VyX3ZpcmlkaXNfYygpICsKICB0aGVtZV9wb2tlbW9uCmBgYAoKCgoK44GT44KM44Gv44OX44Ot44OD44OI44GM6Zuj44GX44GE44Gq4oCmZ2dyaWRnZXPjgZnjgovjgajjgY3jgYzjgY3jgZ/vvJ8KYGBge3J9CiMgcF9wYW5kb3Jhc19yaWRnZXMgPC0KZGZfbm9fYXBwZWFyYW5jZV9yZXNpZHVhbCB8PiAKICAjIG11dGF0ZShnYW1lX2dlbl9lcmEgPSApKSB8PiAKICBnZ3Bsb3QoYWVzKAogICAgeSA9ZmN0X3Jldihhcy5mYWN0b3IoZ2FtZV9nZW5fZXJhKSksCiAgICAjIHkgPSBwYXN0ZTAoIkdlbiIsIGdhbWVfZ2VuX2VyYSwiRXJhLCBHZW4iLCBwb2tlbW9uX2dlbiwgInBva2Vtb25zIiksCiAgICB4ID0gcmVzaWR1YWwsIAogICAgZmlsbCA9IChwb2tlbW9uX2dlbiAtIGdhbWVfZ2VuX2VyYSkgfD4gYXMuZmFjdG9yKCkKICAgICMgZ3JvdXAgPSBwb2tlbW9uX2dlbgogICkpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwKSArCiAgZ2VvbV9kZW5zaXR5X3JpZGdlcygKICAgIHJlbF9taW5faGVpZ2h0ID0gLjAxLAogICAgYmFuZHdpZHRoID0gLjgsCiAgICBhbHBoYSA9IC44LAogICAgc2l6ZSA9IC4yCiAgICApICsKICBzY2FsZV95X2Rpc2NyZXRlKAogICAgIkVyYSIsCiAgICBsYWJlbHMgPSAgODoxIHw+IGFzLnJvbWFuKCkKICApICsKICBzY2FsZV9maWxsX3ZpcmlkaXNfZCgiR2VucyBQYXN0IFJlbGVhc2UiLCBvcHRpb24gPSAiQiIpICsKICB0aGVtZV9wb2tlbW9uICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSBjKDAuMiwgMC44KSkKYGBgCuesrO+8lOS4luS7o+OBvuOBp+OBr+aWsOOBl+OBj+eZu+WgtOOBl+OBn+OBsOOBi+OCiuOBruODneOCseODouODs+OCguaYlOOBi+OCieOBruODneOCseODouODs+OCguWkp+OBl+OBn+W3ruOBr+OBquOBj+W5s+etieOBq+OBqOOCieOCjOOBpuOBhOOBn++8iOOBl+OAgeODqeODs+ODgOODoOOCiOOCiuOCguOBmuOBo+OBqOOBguOBvuOBmeOBqOOBk+OCjeOBquOBj+OBqOOCieOCjOOBpuOBhOOBn++8ieOBjOOAgeesrO+8leS4luS7o+OBp+OBr+aYjuOCieOBi+OBq+esrO+8leS4luS7o+OBjOWEqumBh+OBleOCjOOBpuOBiuOCiuOAgeOBneOBruOCouOCquODquOCkuaYlOOBruS4luS7o+OBn+OBoeOBjOOBj+OBo+OBpuOBhOOCiwoKCiMjIyAKCuOBk+OBk+S7pemZjeOBr+W+ruWmmeOBp+OBl+OBnwoKYGF2ZXJhZ2VfcmVsYXRpdmVfcmFua2DlhahFcmHjgaTjgYbjgZjjgabjga7jg6njg7Pjgq/jga7pq5jjgZXjgILmlbDlgKTjgYzkvY7jgYTjgbvjgankuIrkvY3jgpLntq3mjIHjgZfjgabjgYTjgovjgILkurrmsJfjganjgYLjgYTjgIIwLjXku6XkuIrjgafjgYLjgozjgbDkuK3lpK7ku6XkuIrjgavkurrmsJfjgajjgYTjgaPjgabjgYTjgYTjgILlpJrliIbjgIIKYHJhbmsoKWDplqLmlbDjgZjjgZ/jgYTjga/lsJHjgarjgYTjgbvjgYbjgYvjgonpoIbjgavjg6njg7Pjgq/vvJHkvY3vvIHjgajjgZfjgabjgZfjgb7jgYbjgIJu44GM5aSa44GE44G744Gp44Op44Oz44Kv44GM5LiK5L2N77yI5bCP44GV44GE77yJ44Gr44Gq44Gj44Gm44G744GX44GE44Gu44Gn44CBW+OBk+OBk10oaHR0cHM6Ly9zdGF0cy5zdGFja2V4Y2hhbmdlLmNvbS9xdWVzdGlvbnMvMzMyMS9yYW5rLWluLXItZGVzY2VuZGluZy1vcmRlcinjgpLlj4LogIPjgavpgIbjgavjgZnjgovjgIIKYGBge3J9CmRlY2xpbmVfYW5kX2ZhbGxfb2ZfcG9rZW1vbl9lbXBpcmVfZGYgPC0gdGVtcG9yYWxfY2hhbmdlX3Blcl9nZW5fZGYgfD4gCiAgZmlsdGVyKHJ1biA9PSAxIHwgaXMubmEocnVuKSkgfD4gCiAgZmlsdGVyKGNvbmRpdGlvbiAlaW4lIGMoInBva2Vtb24gbmFtZSIsICJzaW11bGF0aW9ucyIpKSB8PgogICMgcmlnaHRfam9pbihlbXB0eV9yYW5rX2RmKSB8PiAKICBncm91cF9ieShjb25kaXRpb24sIHJ1biwgZ2FtZV9nZW5fZXJhKSB8PiAKICAjIGFycmFuZ2UoZGVzYyhuKSkgfD4gCiAgIyBtdXRhdGUobiA9IHJlcGxhY2VfbmEobiwgMCkpIHw+ICMgTkHjgpLmlL7nva7jgZnjgovjgajmrKHjga5yYW5rKCnjgadOQeOBruOChOOBpOOCieOBrumghuS9jeOBjOS4gOe3kuOBq+OBquOCieOCkwogIG11dGF0ZShyYW5rID0gcmFuaygtbiwgdGllcy5tZXRob2QgPSAibWluIikpIHw+ICAjIGhpZ2hlciBuIC0+IHNtYWxsZXIgcmFuayB3aXRoIC1uCiAgIyBtdXRhdGUocmFuayA9IHJhbmsoLW4sIHRpZXMubWV0aG9kID0gInJhbmRvbSIpKSB8PiAgIyBoaWdoZXIgbiAtPiBzbWFsbGVyIHJhbmsgd2l0aCAtbgogIHVuZ3JvdXAoKSB8PiAKICBzZWxlY3QoY29uZGl0aW9uLCBydW4sIGdhbWVfZ2VuX2VyYSwgcG9rZW1vbl9nZW4sICBwb2tlZGV4X2lkLG4sIHJhbmssIGVjZGYsICkgfD4gCiAgZ3JvdXBfYnkoY29uZGl0aW9uLCBydW4sIGdhbWVfZ2VuX2VyYSkgfD4gCiAgbXV0YXRlKHJlbGF0aXZlX3JhbmsgPSByYW5rL21heChyYW5rLCBuYS5ybSA9IFRSVUUpKSB8PiAKICBmaWx0ZXIoIWlzLm5hKHJlbGF0aXZlX3JhbmspKSB8PiAKICB1bmdyb3VwKCkgfD4gCiAgZ3JvdXBfYnkoY29uZGl0aW9uLCBydW4sIHBva2VkZXhfaWQpIHw+IAogIG11dGF0ZSgKICAgIGF2ZXJhZ2VfcmVsYXRpdmVfcmFuayA9IGF2ZShyZWxhdGl2ZV9yYW5rLCBuYS5ybSA9IFRSVUUpLCAjIDUuLCA2LgogICAgIyBkZWx0YSA9IAogICkgIyAzMCBzZWMKZGVjbGluZV9hbmRfZmFsbF9vZl9wb2tlbW9uX2VtcGlyZV9kZiAjIDg3MzEgeCAxMApgYGAKCgpgYGB7cn0KZGVjbGluZV9hbmRfZmFsbF9vZl9wb2tlbW9uX2VtcGlyZV9kZiB8PiAKICBnZ3Bsb3QoYWVzKHkgPSByZWxhdGl2ZV9yYW5rLCB4ID0gcG9rZWRleF9pZCwgY29sb3VyID0gY29uZGl0aW9uKSkgKwogIGdlb21fcG9pbnQoKQpgYGAK44Gq44KT44GnUG9rZWRleF9pZOOBq+OCiOOBo+OBpuWkieOBque3muOBjOimi+OBiOOCi+OCk+OBmOOCg+ODvO+8gemdoueZveOBhOOBkeOBqee1tuWvvuOBquOCk+OBi+OBrumDveWQiOOBquOBruOBp+WPluOCiumZpOOBj+OAguKGkumzpeOBruOCouOCvuOBkeOBvuOBl+OBn+OBrQptaW7jgafjgoJyYW5kb23jgafjgoLlj5bjgorpmaTjgZHjgZ/jgIJyYW5kb23jgahtaW7jgafpgZXjgYTjgZnjgY7jgoTjgo3jgILjgb7jgYJtaW7jgYzjgojjgYvjgo3jgYbjgIIKCiMjIyDjg53jgrHjg6Ljg7PjgZ3jgozjgZ7jgozjga7kurrmsJfjga7lhaXjgozmm7/jgo/jgooKCgoKYGBge3J9CmRlY2xpbmVfYW5kX2ZhbGxfb2ZfcG9rZW1vbl9lbXBpcmVfZGYgfD4gCiAgZ2dwbG90KGFlcyh4ID0gZ2FtZV9nZW5fZXJhLCAgeSA9IHJlbGF0aXZlX3JhbmssIGdyb3VwID0gcG9rZWRleF9pZCwgY29sb3VyID0gcG9rZWRleF9pZCkpICsKICBnZW9tX2xpbmUoKSArCiAgZ2VvbV9wb2ludCgpICsKICBmYWNldF9ncmlkKAogICAgY29scyA9IHZhcnMocG9rZW1vbl9nZW4pLCAKICAgIHJvd3MgPSB2YXJzKGNvbmRpdGlvbiksIAogICAgc2NhbGVzID0gImZyZWUiCiAgICApICsKICB0aGVtZV9wb2tlbW9uCiAgIyBzY2FsZV95X2NvbnRpbnVvdXModHJhbnMgPSAibG9nMTAiKSAKIyBnZ3NhdmUoIi4vb3V0cHV0L3BfZW1wX2RlY2xpbmVfam91cm5leS5zdmciLCB3aWR0aCA9IDE2NiwgaGVpZ2h0ID0gOTAsIHVuaXQgPSAibW0iLCBkcGkgPSAxMjAwKQpgYGAKCiMjIOaghOaer+ebm+ihsOOCkuOBquOCk+OBqOOBi+ODh+ODq+OCv+eahOOBquaEn+OBmOOBp+aVsOWApOOBq+OBmeOCiwoK44G+44Ga44Gv5bmz5Z2H55qE44Gq44CB5YWo5pyf44KS44Gk44GG44GY44Gm44Gu5Lq65rCX44CBYGF2ZXJhZ2VfcmVsYXRpdmVfcmFua2DjgafjgoTjgaPjgabjgb/jgovjgYvigKYKQXZl44Gn44GE44GE44Gu44GL44KP44GL44KJ44KT44GX44CBcmVsYXRpdmXjgafjgYTjgYTjga7jgYvjgoLjgo/jgYvjgonjgpPjgIHjgarjgpPjgoLjgo/jgYvjgonjgpMKR2VuOOOBruOCguOBruOBr+OBguOBvuOCiuOBq+OCteODs+ODl+ODq+OCteOCpOOCuuOBjOWwkeOBquOBhOOBruOBp++8iEF2ZXJhZ2Xjga7mhI/lkbPjgYzjgarjgYTjga7jgafvvInpmaTjgY/jgIIKCiBzZXR0aW5nIGBwY2ggPSAyMWAgcG9pbnRzIGBjb2xvdXIgPSAidHJhbnNwYXJlbnQiYCBpcyBiZXR0ZXIgYmV0dGVyIHRoYW4gc2V0dGluZyBgc3Ryb2tlID0gMGAsIFtzb3VyY2VdKGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzM4MDgxMTU5L3NsaWdodC1wb2ludC1zdHJva2VzLWluLWdncGxvdC1wb2ludHMpCmBgYHtyfQpwX2F2ZXJhZ2VfcmVsYXRpdmVfcmFuayA8LQogIGRlY2xpbmVfYW5kX2ZhbGxfb2ZfcG9rZW1vbl9lbXBpcmVfZGYgfD4gCiAgZmlsdGVyKHBva2Vtb25fZ2VuIDwgOCkgfD4gCiAgc2VsZWN0KGF2ZXJhZ2VfcmVsYXRpdmVfcmFuaywgcG9rZWRleF9pZCkgfD4gCiAgZGlzdGluY3QoKSB8PiAKICBsZWZ0X2pvaW4oZGZfbmFtZXMsIGJ5ID0gInBva2VkZXhfaWQiKSB8PgogIGdncGxvdChhZXMoeCA9IHBva2Vtb25fZ2VuLCB5ID0gYXZlcmFnZV9yZWxhdGl2ZV9yYW5rLCBjb2xvdXIgPSBjb25kaXRpb24pKSArCiAgZ2VvbV9xdWFzaXJhbmRvbSgKICAgIGRvZGdlLndpZHRoID0gLjgsIAogICAgYWxwaGEgPSAuNywgCiAgICBjb2xvdXIgPSAidHJhbnNwYXJlbnQiLAogICAgc3Ryb2tlID0gMCwKICAgIHBjaCA9IDIxLCBhZXMoZmlsbCA9IGNvbmRpdGlvbikpICsKICBnZW9tX3Ntb290aChzZSA9IEZBTFNFKSArCiAgc2NhbGVfY29sb3VyX21hbnVhbCgKICAgIHZhbHVlcyA9IGMoInBva2Vtb24gbmFtZSIgPSBwb2tlbW9uX2JsdWUsICJzaW11bGF0aW9ucyIgPSBwb2tlbW9uX3llbGxvdykKICApICsKICBzY2FsZV9maWxsX21hbnVhbCgKICAgIHZhbHVlcyA9IGMoInBva2Vtb24gbmFtZSIgPSBwb2tlbW9uX2JsdWUsICJzaW11bGF0aW9ucyIgPSBwb2tlbW9uX3llbGxvdykKICApICsKICBsYWJzKAogICAgeCA9ICJQb2vDqW1vbiBHZW5lcmF0aW9uIiwKICAgIHkgPSAiQXZlcmFnZSBSZWxhdGl2ZSBSYW5rIiwKICApICsKICBmYWNldF9ncmlkKAogICAgY29scyA9IHZhcnMoY29uZGl0aW9uKQogICkgKwogIHRoZW1lX3Bva2Vtb24gKwogIHRoZW1lKAogICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiCiAgKQogIApgYGAK44Gh44KH44Gj44Go5pyA6L+R44Gu44KE44Gk44Gr55SY44GZ44GO44KL5Z+65rqW44Gn44GZ44Gt44GT44KM44Gv4oCm44CCCuaMr+OCiuW5heOBp+OBi+OBhOOChOOBpOOBr+iqsOOBoOKGku+8kOOBi+OCieOBhOOBjeOBquOCiu+8keS9jeOBqOOBi+OBq+OBquOBo+OBn+OChOOBpOOBq+axuuOBvuOBo+OBpuOBhOOCi+OBruOBp+W+ruWmmeOChOOBqgrjgajjga/jgYTjgYjjgIFTaW3jgajmr5TjgbnjgovjgajjgZrjgYTjgbbjgpPlgr7lkJHjgYzjgYLjgovjgILjgojjgYbjgavjgoLmgJ3jgYbjgILjgajjgavjgYvjgY/ln7rmupbjgYzjgaHjgofjgaPjgajpganlvZPjgajjgYTjgYbjgYvjgIHjgajjgorjgYLjgYjjgZrkvZzjgaPjgZ/jgoLjga7jgaDjgYvjgonjgarjgpPjgajjgoLjgYTjgYjjgpPjgarjgIJyYW5r44GY44KD44Gg44KB44GL44Gq44GC44CA44G144Gk44GG44GrbuOBp+OChOOBo+OBpuOCguOBhOOBhOOBi+OCguOAguaomea6luWMluOBl+OBpuKApuOAggoKCuOChOOBo+OBseOCiuaMr+OCiuW5heOBruWQiOioiOOBi+OBquODvOOAgOOCuOODo+ODvOODi+ODvOOBjOOCiApgYGB7cn0KZGVjbGluZV9hbmRfZmFsbF9vZl9wb2tlbW9uX2VtcGlyZV9kZjIgPC0gCiAgZGVjbGluZV9hbmRfZmFsbF9vZl9wb2tlbW9uX2VtcGlyZV9kZiB8PiAgIyBjbGljayBnYW1lX2dlbl9lcmEsIHBva2VkZXhfaWQgdGhlbiBjb25kaXRpb24KICB1bmdyb3VwKCkgfD4gCiAgZ3JvdXBfYnkoY29uZGl0aW9uLCBwb2tlZGV4X2lkKSB8PiAKICBtdXRhdGUoCiAgICBwcmV2aW91c19yZWxhdGl2ZV9yYW5rID0gbGVhZChyZWxhdGl2ZV9yYW5rLCBvcmRlcl9ieSA9IGdhbWVfZ2VuX2VyYSksCiAgICBkZWx0YSA9IHJlbGF0aXZlX3JhbmsgLSBwcmV2aW91c19yZWxhdGl2ZV9yYW5rLAogICAgc3VtX2RlbHRhID0gc3VtKGFicyhkZWx0YSksIG5hLnJtID0gVFJVRSksICMgdG90YWwgam91cm5leQogICAgYXZlX3N1bV9kZWx0YSA9IHN1bV9kZWx0YSAgLyAoIDggLSBwb2tlbW9uX2dlbikgIyBhdmVyYWdlIGpvdXJuZXkgcGVyIGdhbWUgZ2VuIGNoYW5nZQogICkgfD4gCiAgc2VsZWN0KHBva2Vtb25fZ2VuLCBwb2tlZGV4X2lkLCBhdmVfc3VtX2RlbHRhKSB8PgogIGRpc3RpbmN0KCkKZGVjbGluZV9hbmRfZmFsbF9vZl9wb2tlbW9uX2VtcGlyZV9kZjIgfD4gCiAgZ2dwbG90KGFlcyh4ID0gcG9rZW1vbl9nZW4sIGF2ZV9zdW1fZGVsdGEpKSArCiAgZ2VvbV9xdWFzaXJhbmRvbSgpCmBgYArjgarjgpPjgYvjgYLjgYvjgpPjgo8KCgpgYGB7cn0KZGVjbGluZV9hbmRfZmFsbF9vZl9wb2tlbW9uX2VtcGlyZV9kZjMgPC0gCmRlY2xpbmVfYW5kX2ZhbGxfb2ZfcG9rZW1vbl9lbXBpcmVfZGYyIHw+IAogIHVuZ3JvdXAoKSB8PiAKICBncm91cF9ieShjb25kaXRpb24sIGdhbWVfZ2VuX2VyYSkgfD4gCiAgbXV0YXRlKHN0YW5kYXJkaXplZF9uID0gbiAvIG1heChuKSkgfD4gCiAgdW5ncm91cCgpIHw+IAogIGdyb3VwX2J5KGNvbmRpdGlvbiwgcG9rZWRleF9pZCkgfD4gCiAgbXV0YXRlKGF2Z19zdGRfbiA9IGF2ZShzdGFuZGFyZGl6ZWRfbikpCmRlY2xpbmVfYW5kX2ZhbGxfb2ZfcG9rZW1vbl9lbXBpcmVfZGYzIHw+IAogIGdncGxvdChhZXMocG9rZW1vbl9nZW4sIGF2Z19zdGRfbiwgIGdyb3VwID0gcG9rZWRleF9pZCwgY29sb3VyID0gYXZlcmFnZV9yZWxhdGl2ZV9yYW5rKSkgKwogIGdlb21fcXVhc2lyYW5kb20oKSArCiAgIyBnZW9tX3JpZGdlbGluZSgpICsKICBmYWNldF93cmFwKAogICAgdmFycyhjb25kaXRpb24pCiAgKSArCiAgc2NhbGVfY29sb3VyX3ZpcmlkaXNfYygpICsKICB0aGVtZV9wb2tlbW9uICsKICB0aGVtZSgKICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIgogICkKYGBgCgpgYGB7cn0KZGVjbGluZV9hbmRfZmFsbF9vZl9wb2tlbW9uX2VtcGlyZV9kZjMgfD4gCiAgc2VsZWN0KGF2ZV9zdW1fZGVsdGEsIGF2Z19zdGRfbiwgcG9rZW1vbl9nZW4pIHw+IAogIGRpc3RpbmN0KCkgfD4gCiAgZ2dwbG90KGFlcyhhdmVfc3VtX2RlbHRhLCBhdmdfc3RkX24sIGNvbG91ciA9IHBva2Vtb25fZ2VuKSkgKwogIGdlb21fcG9pbnQoc2l6ZSA9IDEsIGFscGhhID0gLjMpICsKICBzY2FsZV9jb2xvdXJfdmlyaWRpc19jKCkgKwogIGZhY2V0X3dyYXAoCiAgICB2YXJzKHBva2Vtb25fZ2VuKQogICkKYGBgCgrjgoLjgYbjgYLjgYvjgpPjgo/jgILjgZPjgYbjgYTjgYbjga7jgZjjgoPjgarjgY/jgabjgIHjgajjgorjgYLjgYjjgZrjg5fjg63jg4Pjg4jjgafjg4/jgqTjg6njgqTjg4jjgZnjgovjg53jgrHjg6Ljg7PjgpLmsbrjgoHjgZ/jgYTjgaDjgZHjgarjga7jgafjgIHjgoTjgaPjgbHjgorlkITmmYLku6Pjga7vvJPkvY3jgY/jgonjgYTjgb7jgafjga7li5XlkJHjgpLoqr/jgbnjgovjgaDjgZHjgafjgYvjgarjgorjgYTjgYTjgajmgJ3jgYbjgIIK5bCR44Gq44GP44Go44KC77yR44Gk44CBcmFua+OBjDPku6XkuIvjga7ooYzjgpLlkKvjgoDjgrDjg6vjg7zjg5fjgpLov5TjgZnjgIHjgajjgYTjgYbjga7jga9ba29yZV0oaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNDA4MjUwMzcvc2VsZWN0LWdyb3Vwcy13aGljaC1oYXZlLWF0LWxlYXN0LW9uZS1vZi1hLWNlcnRhaW4tdmFsdWUp44Gn44Gn44GN44KL44Go5oCd44GG44CCCgpgYGB7cn0KZGVjbGluZV9hbmRfZmFsbF9vZl9wb2tlbW9uX2VtcGlyZV9kZjNfYmFja2dyb3VuZCA8LSBkZWNsaW5lX2FuZF9mYWxsX29mX3Bva2Vtb25fZW1waXJlX2RmMyB8PiAKICBmaWx0ZXIoY29uZGl0aW9uID09ICJwb2tlbW9uIG5hbWUiKSB8PiAKICB1bmdyb3VwKCkgfD4gCiAgc2VsZWN0KG4sIHBva2VkZXhfaWQsIGdhbWVfZ2VuX2VyYSwgcG9rZW1vbl9nZW4pIHw+IGRpc3RpbmN0KCkKICAKIyBkZl90b3BfcG9rZW1vbiA8LSAKIyAgIGRlY2xpbmVfYW5kX2ZhbGxfb2ZfcG9rZW1vbl9lbXBpcmVfZGYzIHw+IAojICAgdW5ncm91cCgpIHw+IAojICAgZ3JvdXBfYnkoY29uZGl0aW9uLCBwb2tlZGV4X2lkKSB8PiAKIyAgIGZpbHRlcihhbnkocmFuayA8PSAxKSkgfD4gCiMgICAjIGZpbHRlcihwb2tlZGV4X2lkICVpbiUgdG9wX3RocmVlJHBva2VkZXhfaWQgJiBjb25kaXRpb24gPT0gKQojICAgbGVmdF9qb2luKGRmX25hbWVzLCBieSA9IGMoInBva2VkZXhfaWQiLCAicG9rZW1vbl9nZW4iKSkgfD4gCiMgICBmaWx0ZXIoY29uZGl0aW9uID09ICJwb2tlbW9uIG5hbWUiKQpkZl90b3BfcG9rZW1vbiB8PiAKICBnZ3Bsb3QoYWVzKHggPSBnYW1lX2dlbl9lcmEsIHkgPSBuKSkgKwogIGdlb21fcXVhc2lyYW5kb20oCiAgICBkYXRhID0gZGVjbGluZV9hbmRfZmFsbF9vZl9wb2tlbW9uX2VtcGlyZV9kZjNfYmFja2dyb3VuZCwgCiAgICBhZXMoY29sb3VyID0gcG9rZW1vbl9nZW4sIGdyb3VwID0gcG9rZW1vbl9nZW4gfD4gYXMuZmFjdG9yKCkpLAogICAgc2l6ZSA9IC4yLAogICAgZG9kZ2Uud2lkdGggPSAuOAogICAgKSArCiAgZ2VvbV9saW5lKGFlcyhjb2xvdXIgPSBwb2tlbW9uX2dlbiwgZ3JvdXAgPSBwb2tlZGV4X2lkLCksIHNpemUgPSAuMywgYWxwaGEgPSAuNSkgKwogIGdlb21faW1hZ2UoYWVzKGltYWdlID0gaW1hZ2VfbGFyZ2UpLCBoZWlnaHQ9IC4wNSwgYnkgPSAid2lkdGgiLCBhc3AgPSAxLjUpICsKICAjIHNjYWxlX3NpemVfaWRlbnRpdHkoKSArCiAgZ2VvbV90ZXh0X3JlcGVsKAogICAgYWVzKGxhYmVsID0gcGFzdGUwKHBva2Vtb25fbmFtZSwgIjpyPSIsIHJhbmssICJuPSIsIG4pKSwKICAgIG1pbi5zZWdtZW50Lmxlbmd0aCA9IDAsCiAgICBmYW1pbHkgPSAiUm90aXMgU2VtaVNhbnMgU3RkIExpZ2h0IiwKICAgIHNlZ21lbnQuc2l6ZSA9IC4xLAogICAgbWF4Lm92ZXJsYXBzID0gNTAsCiAgICBzaXplID0gMyAqIHB0X2NvbnZlcnQsCiAgICBoanVzdCA9IDAKICAgICkgKwogIHNjYWxlX2NvbG91cl92aXJpZGlzX2MoKSArCiAgZmFjZXRfd3JhcCh2YXJzKGNvbmRpdGlvbikpICsKICBzY2FsZV95X2NvbnRpbnVvdXModHJhbnMgPSAibG9nMTAiKSArCiAgdGhlbWVfcG9rZW1vbiArCiAgdGhlbWUoCiAgICBhc3BlY3QucmF0aW8gPSAxLzEuNSwKICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikKZ2dzYXZlKCIuL291dHB1dC9wX2VtcF92c19zaW1fdG9wX3RocmVlX2RlY2xpbmVfYW5kX2ZhbGwuc3ZnIiwgaGVpZ2h0ID0gODAsIHdpZHRoID0gODAgKiAxLjUsIHVuaXRzID0gIm1tIikKYGBgCgo=